﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SharpNoisePCL.Helpers
{
    public class Interpolaters
    {
        public static float Lerp(float v0, float v1, float t)
        {
            return v0 + t * (v1 - v0);
        }

        public static float Linear(float v0, float v1, float t)
        {
            return v0 + (v1 - v0) * t;
        }

        public static float Cosine(float v0, float v1, float t)
        {
            double ft = t * Math.PI;
            double f = (1 - Math.Cos(ft)) / 2;
            return (float)(v0 * (1 - f) + v1 * f);
        }

        public static float Cubic(float v0, float v1, float v2, float v3, float t)
        {

            float a0, a1, a2, a3, t2;

            t2 = t * t;

            a0 = v3 - v2 - v0 + v1;
            a1 = v0 - v1 - a0;
            a2 = v2 - v0;
            a3 = v1;

            return (a0 * t * t2 + a1 * t2 + a2 * t + a3);
        }

        public static float CatMullRom(float v0, float v1, float v2, float v3, float t)
        {
            double a0, a1, a2, a3, t2;

            t2 = t * t;

            a0 = -0.5 * v0 + 1.5 * v1 - 1.5 * v2 + 0.5 * v3;
            a1 = v0 - 2.5 * v1 + 2 * v2 - 0.5 * v3;
            a2 = -0.5 * v0 + 0.5 * v2;
            a3 = v1;

            return (float)(a0 * t * t2 + a1 * t2 + a2 * t + a3);
        }

        public float Hermite(float v0, float v1, float v2, float v3, float t, float tension, float bias)
        {
            float m0, m1, t2, t3;
            float a0, a1, a2, a3;

            t2 = t * t;
            t3 = t2 * t;
            m0 = (v1 - v0) * (1 + bias) * (1 - tension) / 2;
            m0 += (v2 - v1) * (1 - bias) * (1 - tension) / 2;
            m1 = (v2 - v1) * (1 + bias) * (1 - tension) / 2;
            m1 += (v3 - v2) * (1 - bias) * (1 - tension) / 2;
            a0 = 2 * t3 - 3 * t2 + 1;
            a1 = t3 - 2 * t2 + t;
            a2 = t3 - t2;
            a3 = -2 * t3 + 3 * t2;

            return (a0 * v1 + a1 * m0 + a2 * m1 + a3 * v2);
        }
    }
}

